<?php
/**
 * JoiGallery - image gallery component for Joostina
 *
 * Frontend event handler
 *
 * @version 1.0 alpha 12
 * @package JoiGallery
 * @filename joigallery.php
 * @author JoostinaTeam
 * @copyright (C) 2008-2009 Joostina Team
 * @license see license.txt
 *
 **/

// запрет прямого доступа
defined('_VALID_MOS') or die();

require_once ($mainframe->getPath('class'));
require_once ($mainframe->getPath('front_html'));

$my->gid = joiGalleryHelper::get_my_gid();
$my->gid = $gid = intval($my->gid);

//Подключаем js
joiGalleryHelper::_load_core_js();
//Подключаем CSS
$mainframe->addCSS(JPATH_SITE.'/components/com_joigallery/view/css/joigallery.css');

//Загружаем настройки
$params = _setup();

switch ($params->_act) {

	case 'photos':
		_photos($params);
		break;
	default:

	case 'category':
	case 'categories':
		_categories($params);
		break;
}

function _photos($params) {

	$id = intval(mosGetParam($_REQUEST, 'id', 0));

	switch ($params->_task) {
		case 'new':
			HTML_joigallery::newPhoto($params);
			break;
		case 'process_upload':
			_process_upload($params);
			break;
		case 'edit':
			edit_item($params->_cid, $params);
			break;
		case 'apply':
		case 'save':
			update_item($params);
			break;
		case 'remove':
			remove_item($params->_cid, $params);
			break;
		case 'cancel':
			_cancel('photos', $id, $params);
			break;
		default:
			view_item($params->_cid, $params);
			break;
	}
}

function _categories($params) {

	$id = intval(mosGetParam($_REQUEST, 'id', 0));

	switch ($params->_task) {
		case 'new':
			edit_category(0, $params);
			break;
		case 'edit':
			edit_category($params->_cid, $params);
			break;
		case 'apply':
		case 'save':
			save_category();
			break;
		case 'cancel':
			_cancel('categories', $id, $params);
			break;
		case 'remove':
			remove_category($params->_cid, $params);
			break;
		default:
			view_category_cache($params->_cid, $params);
			break;
	}
}


/* ------------------------------------------------------------- */ 
/* -------------------------- КАТЕГОРИИ ------------------------ */ 
/* ------------------------------------------------------------- */


/***************************************
*
* Просмотр категорий (кэш)
*
* @param int $cid
* @param array $params
*
****************************************/
 function view_category_cache($cid, $params) {

  $mainframe = &mosMainFrame::getInstance();

  $cid = intval($cid);

  $cache = &mosCache::getCache('com_content');
  $r = $cache->call('view_category', $cid, $params);

  //Подключаем файл стилей перед(!) извлечением страницы из кэша 
  if (!$cid) {//Мы на главной странице
       $mainframe->addCSS(_JOI_GALLERY_FRONT_SITE.'/view/css/'.$params->get('template_main_css') );
	   
	   if ($params->get('template_main_use_lightbox')) //Загружаем FancyBox на главную
			mosCommonHTML::loadJqueryPlugins('fancybox/jquery.fancybox',false, true);
  }
  else {  
       $mainframe->addCSS(_JOI_GALLERY_FRONT_SITE.'/view/css/'.$params->get('template_cat_css') );
       
       if ($params->get('template_cat_use_lightbox')) // Загружаем FancyBox в категорию
            mosCommonHTML::loadJqueryPlugins('fancybox/jquery.fancybox',false, true);
  }	   
  
  //Проверка существования файла
  //if (!file_exists(_JOI_GALLERY_FRONT_BASE.'/view/css/'.$params->get('template_main_css') ))	   
  //    $mainframe->set_mosmsg(sprintf(_C_JOIGALLERY_MSG_CSS_NOT_FOUND,$params->get('template_main_css')));				   

  from_cache($r);
  unset($r);
  return;
}


/***************************************
*
* Просмотр категорий
*
* @param int $cid
* @param array $params
*
****************************************/
function view_category($cid, $params) {
  global $my;

  $database = &database::getInstance();

  $cid = intval($cid);

  $cat = new joiGalleryCategory($database);
  $cat->load($cid);

  $photos = new joiGalleryPhoto($database);
 
  $show_all = false;
  if (!$cid) {//Мы на главной странице
   
    //Выводить только категории верхнего уровня или все, независимо от вложенности
    $show_all = ($params->get('template_main_view_subcats')) ? true : false;
    
	$cat->subcats = $subcats = $cat->get_categories($cid, $show_all, $params);
	$cat->total = $photos->get_count_photos($cid, $params, $cat->subcats);
	
	if ( $params->get('template_main_view_subcats') == 2 ) {//Не отображать категории на главной        
		 $cat->subcats = '';
    }
    	
	//Вывод изображений	на главной
	switch ($params->get('template_main_view_items')) {	
			//Выводить изображений только верхнего уровня
			case 0: $subcats = $cat->get_all_parent_cats();//Получаем id всех родительских категорий
					$photos->content = $photos->load_photos($cid, $params, $subcats, $params->template_main_hide_default);
					break;
			//Выводить изображений независимо от вложенности		
			case 1: $photos->content = $photos->load_photos($cid, $params, $subcats, $params->template_main_hide_default);
					break;
			//Не выводить		
			case 2: $photos->content = '';
					break; 	
	}//switch	

  }
  else {//Мы в категории  
  
  
    //Выводить только категории верхнего уровня или все, независимо от вложенности
    $show_all = ($params->get('cat_view_subcats')) ? true : false;
    
	$cat->subcats = $subcats = $cat->get_categories($cid, $show_all, $params);
	$cat->total = $photos->get_count_photos($cid, $params, $cat->subcats);
	
	if ( $params->get('cat_view_subcats') == 2 ) {//Не отображать категории на главной        
		 $cat->subcats = '';
    }
    
	//Вывод изображений	в категории	
	switch ($params->get('cat_view_items')) {	
			//Выводить изображений только из текущуй категории
			case 0: $subcats = 0;
					$photos->content = $photos->load_photos($cid, $params, $subcats, $params->template_cat_hide_default);
					break;
			//Выводить изображений независимо от вложенности		
			case 1: $photos->content = $photos->load_photos($cid, $params, $subcats, $params->template_cat_hide_default);
					break;
			//Не выводить		
			case 2: $photos->content = '';
					break; 	
	}//switch	


  }//else 

  HTML_joigallery::viewCategory($cat, $photos, $params);
}


/***************************************
*
* Добавление/Редактирование категории
*
* @param int $id
* @param array $params
*
****************************************/
function edit_category($id, $params) {
	global $my;
	
	$database = &database::getInstance();
	
	//echo '$my->id = '. $my->id;
	//echo '<br/>$my->gid = '. $my->gid;

	//if (!$my->id && $my->gid != 2) {
	//	mosNotAuth();
	//	return;
	//}

	$cat = new joiGalleryCategory($database);
	$cat->load($id);

	if (!$cat->id) {
		$cat->published = 1;
		$cat->parent_id = intval(mosGetParam($_REQUEST, 'cid', 0));
	}

	$categories = joiGalleryCategory::getCategoryTree();
	$obj = new stdClass();
	$obj->id = 0;
	$obj->name = '&mdash;&nbsp;'._C_JOIGALLERY_CATEGORY_ROOT.'&nbsp;';
	array_unshift($categories, $obj);

	$cat->catlist = $categories;

	HTML_joigallery::editCategory($cat, $params);
}


/***************************************
*
* Сохранение категории
*
****************************************/
function save_category() {
	global $task, $option, $my, $Itemid;
	
	$database = &database::getInstance();

	//if (!$my->id && $my->gid != 2) {
	//	mosNotAuth();
	//	return;
	//}

	$row = new joiGalleryCategory($database);
	$row->bind($_POST);

	if (!$row->id) {
		$row->ordering = 999999999;
	}

	// avoid linking category to itself
	if ($row->parent_id == $row->id) {
		$row->parent_id = 0;
	}

	$row->section = 'com_joigallery';

	$row->published = intval(mosGetParam($_REQUEST, 'published', 0));

	if (!$row->check()) {
		echo "<script> alert('" . $row->getError() . "'); window.history.go(-1); </script>\n";
		exit();
	}
	if (!$row->store()) {
		echo "<script> alert('" . $row->getError() . "'); window.history.go(-1); </script>\n";
		exit();
	}

	$row->updateOrder('section = \'com_joigallery\'');

	switch ($task) {
		case 'apply':
			mosRedirect('index.php?option=' . $option . '&amp;act=categories&amp;task=edit&amp;cid=' . $row->id . '&amp;Itemid=' . $Itemid);
			break;
		case 'save':
			mosRedirect('index.php?option=' . $option . '&amp;act=categories&amp;cid=' . $row->id . '&amp;Itemid=' . $Itemid);
			break;
	}
	
}


/***************************************
*
* Удаление категории
*
* @param int $cid
* @param array $params
*
****************************************/
function remove_category($cid, $params) {
	global $my;

	if(!$params->_access->allow_me('del_cat', $my->gid)) {
		joiGalleryError::error($params->_access->error('del_cat'));
	}

	$database = &database::getInstance();
	$cat = new joiGalleryCategory($database);

	$photos = new joiGalleryPhoto($database);

	$total_photos = $photos->check_photos_by_cat($cid);
	if ($total_photos > 0) {
		joiGalleryError::error(addslashes(_C_JOIGALLERY_CATEGORY_DELETE_STILL_PHOTOS));
	}

	$total_subcats = $photos->check_subcats_by_cat($cid);
	if ($total_subcats > 0) {
		joiGalleryError::error(addslashes(_C_JOIGALLERY_CATEGORY_DELETE_STILL_SUBCATS));
	}

	$cat->delete($cid);

	mosRedirect('index.php?option=' . $params->_option . '&amp;Itemid=' . $params->_Itemid);

}


/* ------------------------------------------------------------- */ 
/* --------------------------- ОБЪЕКТЫ ------------------------- */ 
/* ------------------------------------------------------------- */


/***************************************
*
* Загрузка изображения с фронта
*
* @param array $params
*
****************************************/ 
function _process_upload($params) {
    global $my;
    
    $mainframe = &mosMainFrame::getInstance();
    $return    = processImage::upload_handler($params);

    if ($return == 1) $msg = 'Изображение было успешно добавлено.';
    else              $msg = 'Изображения ('.$return.') успешно добавлены.'; 
    
    if (     !$params->get('add_image_pubunpub', 1)                   //Переключатель «Опубликовано»
        || ( !$params->_access->allow_me('set_state', $my->gid)      //Смена статуса любой публикации
        ||   !$params->_access->allow_me('set_state_own', $my->gid) )//Смена статуса своей публикации
       ) {

         if($params->_access->allow_me('no_premoderate', $my->gid)) {//Публикация без премодерации
            if($return == 1) $redirect_photo = 1;     
            else             $redirect_photo = 0; 
         }
         else {
            $redirect_photo = 0;
            if($return == 1){
                $msg .= ' Оно будет опубликовано после проверки модератором.'; 
            }
 
         }
    }
    
    if(!$redirect_photo){
        mosRedirect('index.php?option='.$params->_option.'&amp;act=categories&amp;cid='.$params->_cid.'&amp;Itemid='.$params->_Itemid, $msg);    
    }
    else{
        mosRedirect('index.php?option='.$params->_option.'&amp;act=categories&amp;cid='.$params->_cid.'&amp;Itemid='.$params->_Itemid, $msg);    
    }
	
}


/***************************************
*
* Редактирование изображения
*
* @param int $id
* @param array $params
*
****************************************/ 
function edit_item($id, $params) {
	global $my;

	$database = &database::getInstance();

	$photo = new joiGalleryPhoto($database);
	$photo->load($id);

	$categories = joiGalleryCategory::getCategoryTree();
/**
 * 	$obj = new stdClass();
 * 	$obj->id = 0;
 * 	$obj->name = ' - select - ';
 * 	array_unshift($categories, $obj);
 */
	$photo->catlist = $categories;

	HTML_joigallery::editItem($photo, $params);
}


/***************************************
*
* Сохранение отредактированнной информации
*
* @param array $params
*
****************************************/ 
function update_item($params) {
  global $my;

  $mainframe = &mosMainFrame::getInstance();
  $database = $mainframe->_db;

  //if (!$my->id && $my->gid != 2) {
  //      mosNotAuth();
  //      return;
  //}

  $photo = new joiGalleryPhoto($database);
  $photo->bind($_POST);

  $photo->default = intval(mosGetParam($_REQUEST, 'default', 0));

  if ($photo->default) {
        $photo->clean_default($photo->cid);
  }

  if (!$photo->id) {
        $photo->ordering = 999999999;
  }

  if (!$photo->check()) {
        echo "<script> alert('" . $photo->getError() . "'); window.history.go(-1); </script>\n";
        exit();
  }
  if (!$photo->store()) {
        echo "<script> alert('" . $photo->getError() . "'); window.history.go(-1); </script>\n";
        exit();
  }

  $photo->updateOrder('cid = ' . (int)$photo->cid);

  //Дополнительные поля
  $extra_fields = new joiExtraFields($mainframe, 'com_joigallery');
  $extra_fields->save_fields_values($photo->id);

  switch ($params->_task) {
    case 'save':
            mosRedirect('index.php?option=' . $params->_option . '&amp;act=photos&amp;cid=' . $photo->id . '&amp;Itemid=' . $params->_Itemid);
            break;
    case 'apply':
            mosRedirect('index.php?option=' . $params->_option . '&amp;act=photos&amp;task=edit&amp;cid=' . $photo->id . '&amp;Itemid=' . $params->_Itemid);
            break;
  }
}


function view_item($id, $params) {
  global $my;
  $database = &database::getInstance();

  $row = new joiGalleryPhoto($database);
  $row->load($id);

  $row = $row->get_img_atribs($row, $params);

  $cat = new joiGalleryCategory($database);
  $cat->load($row->cid);

  if (($cat->id > 0) && ($cat->access > $my->gid) || ($row->state < 1 && $my->gid != 2) || ($cat->published < 1 && $my->gid != 2 && $cat->id)) {
        mosNotAuth();
        return;
  }

  $user = new mosUser($database);
  $user->load($row->user_id);
  $row->user = $user;

  $row->next = $row->get_next($row, $params);
  $row->prev = $row->get_prev($row, $params);

  HTML_joigallery::viewItem($row, $params);
}


/***************************************
*
* Удаление изображения
*
* @param int $cid
* @param array $params
*
****************************************/
function remove_item($id, $params) {
	global $my;

	if(!$params->_access->allow_me('del_photo', $my->gid)) {
		joiGalleryError::error($params->_access->error('del_photo'));
	}

    $mainframe = &mosMainFrame::getInstance();
	$database = $mainframe->_db;

	$row = new joiGalleryPhoto($database);

	$row->load($id);

	if($my->id == $row->user_id && !$params->_access->allow_me('del_own_photo', $my->gid)) {
		joiGalleryError::error($params->_access->error('del_own_photo'));
		return false;
	}

	if($my->id != $row->user_id && !$params->_access->allow_me('del_photo', $my->gid)) {
		joiGalleryError::error($params->_access->error('del_own_photo'));
		return false;
	}


	$row->remove_images($row, $params);
	$row->delete();
	$row->updateOrder('cid = ' . $row->cid);
    
    $row->check_main_photo($row->cid);
    
    //Дополнительные поля
    $extra_fields = new joiExtraFields($mainframe, 'com_joigallery');
    $extra_fields->delete_values_by_obj($row->id);

	mosRedirect(sefRelToAbs('index.php?option=' . $params->_option . '&amp;act=categories&amp;cid=' . $row->cid . '&amp;Itemid=' . $params->_Itemid));

}


/* ------------------------------------------------------------- */ 
/* -------------------------- НАСТРОЙКИ ------------------------ */ 
/* ------------------------------------------------------------- */


/***************************************
*
* Загрузка настроек
*
****************************************/ 
function _setup() {
	global $Itemid, $my;

	$mainframe = &mosMainFrame::getInstance();
	$database = $mainframe->_db;

	$group = mosGetParam($_REQUEST, 'cid', 'default');
	$params = new joiGalleryConfig($database, 'joigallery', $group);

	$params->_option = mosGetParam($_REQUEST, 'option');
	$params->_task = mosGetParam($_REQUEST, 'task');
	$params->_Itemid = mosGetParam($_REQUEST, 'Itemid', '');
	$params->_limitstart = intval(mosGetParam($_REQUEST, 'limitstart'));
	$params->_limit = intval(mosGetParam($_REQUEST, 'limit', $params->thumbnails_limit));
	$params->_act = mosGetParam($_REQUEST, 'act');

	$params->_cid = mosGetParam($_REQUEST, 'cid', $params->get('cid', 0));
	if (is_array($params->_cid)) {
		$params->_cid = $params->_cid[0];
	}
	//Права пользователей
	$accsess = new joiGalleryRights($params->u_rights);
	$params->_access = $accsess;

	return $params;
}


/* ------------------------------------------------------------- */ 
/* ------------------ ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ ------------------- */ 
/* ------------------------------------------------------------- */


/***************************************
*
* Отмена
*
* @param string $act
* @param int $id
* @param array $params
*
****************************************/
function _cancel($act, $id, $params) {
	mosRedirect('index.php?option=' . $params->_option . ($id > 0 ? '&amp;act=' . $act . '&amp;cid=' . $id : '') . '&amp;Itemid=' . $params->_Itemid);
}


/***************************************
*
* Извлечение из кэша
*
* @param string $cache
*
****************************************/
 function from_cache($cache) {
  $meta = new contentMeta($cache['params']);
  $meta->set_meta();
  echo $cache['content'];
  return false;
}